/**
 * @file debug_info.h
 * @brief 调试信息结构定义
 * @author VimLVM Team
 * @date 2025
 */

#ifndef VIML_DEBUG_INFO_H
#define VIML_DEBUG_INFO_H

#include "instruction.h"
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>

namespace viml {

// 调试信息结构
struct DebugInfo {
    std::vector<LineInfo> line_map; // 字节码偏移 -> 源文件行号映射
    std::unordered_map<std::string, size_t> var_map;     // 变量名到寄存器映射
    std::unordered_map<size_t, std::string> reg_names;   // 寄存器到变量名映射
    
    void add_line_mapping(uint32_t bytecode_offset, uint32_t source_line) {
        line_map.emplace_back(bytecode_offset, source_line);
    }
    
    void add_variable_mapping(const std::string& name, size_t register_index) {
        var_map[name] = register_index;
        reg_names[register_index] = name;
    }
    
    size_t get_line_for_offset(size_t offset) const {
        if (line_map.empty()) return 0;
        
        // 使用二分查找找到对应的行号
        auto it = std::upper_bound(line_map.begin(), line_map.end(), offset,
            [](size_t offset, const LineInfo& info) {
                return offset < info.bytecode_offset;
            });
        
        if (it == line_map.begin()) {
            return line_map.front().source_line;
        }
        
        return (--it)->source_line;
    }
    
    size_t get_offset_for_line(size_t line) const {
        for (const auto& info : line_map) {
            if (info.source_line == line) {
                return info.bytecode_offset;
            }
        }
        return 0;
    }
    
    size_t get_offset_for_variable(const std::string& name) const {
        auto it = var_map.find(name);
        if (it != var_map.end()) {
            return it->second;
        }
        return 0;
    }
};

} // namespace viml

#endif // VIML_DEBUG_INFO_H